package com.qfedu.microcoupon.template.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.qfedu.common.core.entity.CouponTemplate;
import com.qfedu.common.core.enums.CouponTypeEnum;
import com.qfedu.common.core.exception.CommonException;
import com.qfedu.common.core.utils.UserUtils;
import com.qfedu.common.redis.utils.RedisCache;
import com.qfedu.microcoupon.coupon.bo.CouponCountInfoBO;
import com.qfedu.microcoupon.coupon.service.CouponInfoService;
import com.qfedu.microcoupon.template.mapper.CouponTemplateMapper;
import com.qfedu.microcoupon.template.param.CouponTemplateParam;
import com.qfedu.microcoupon.template.service.CouponTemplateService;
import com.qfedu.microcoupon.template.vo.CouponTemplateVO;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Classname CouponTemplateServiceImpl
 * @Description TODO
 * @Date 2025-09-25 10:04
 * @Created by 老任与码
 */
@Service
public class CouponTemplateServiceImpl implements CouponTemplateService {

    @Resource
    private CouponTemplateMapper couponTemplateMapper;

    @Resource
    private RedisCache redisCache;

    @Lazy
    @Resource
    private CouponInfoService couponInfoService;

    @Override
    public void addTemplate(CouponTemplateParam couponTemplateParam) {
        CouponTypeEnum couponType = CouponTypeEnum.getCouponTypeEnum(couponTemplateParam.getType());
        switch (couponType) {
            case FULL_DISCOUNT:
                if (couponTemplateParam.getDiscount().intValue() <= 0 || couponTemplateParam.getBasePrice().intValue() <= 0) {
                    throw new CommonException("满减券基础值和折扣值必须大于0");
                }
                if (couponTemplateParam.getDiscount().intValue() > couponTemplateParam.getBasePrice().intValue()) {
                    throw new CommonException("满减券的基础值不能小于折扣值");
                }
                break;
            case INSTANT_DISCOUNT:
                break;
            case DISCOUNT:
                break;
        }
        // 判断过期类型等数据是否满足要求

        // 添加数据
        CouponTemplate couponTemplate = new CouponTemplate();
        BeanUtils.copyProperties(couponTemplateParam, couponTemplate);
        couponTemplateMapper.insert(couponTemplate);


        // 生成优惠券的编码,规则：  年月日 + 优惠券id  +  1-100XXX
        // 优化，异步生成code
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String date = sdf.format(new Date());
        int length = couponTemplateParam.getAmount().toString().length();
        List<String> couponCodeList = new ArrayList<>();

        if (couponTemplateParam.getAmount() > 0) {
            for (int i = 1; i <= couponTemplateParam.getAmount(); i++) {
                String suffix = StrUtil.padPre(String.valueOf(i), length, "0");
                String code = date + couponTemplate.getId().toString() + suffix;
                couponCodeList.add(code);
            }
            // 将数据存入redis的list类型中
            redisCache.setCacheList("coupon:template:" + couponTemplate.getId(), couponCodeList);
        }
    }

    /**
     * 根据产品类型取模版时，需要判断模版是否过期，如果过期，修改表中数据状态
     *
     * @param productType
     * @return 返回可用的模版
     */
    @Override
    public List<CouponTemplate> templateByProductType(Integer productType) {

        List<CouponTemplate> couponTemplates = couponTemplateMapper.selectList(Wrappers.lambdaQuery(CouponTemplate.class)
                .eq(CouponTemplate::getProductType, productType)
                .eq(CouponTemplate::getExpireFlag, 0));

        List<CouponTemplate> availableTemplate = availableTemplate(couponTemplates);

        return availableTemplate;
    }

    @Override
    public List<CouponTemplateVO> getTemplate() {

        Integer uid = UserUtils.getUid();

        List<CouponTemplate> couponTemplates = couponTemplateMapper.selectList(Wrappers.lambdaQuery(CouponTemplate.class)
                .eq(CouponTemplate::getDistributeType, 2)
                .eq(CouponTemplate::getExpireFlag, 0));

        // 得到可用的模版，将过期的模版状态改为1
        List<CouponTemplate> availableTemplate = availableTemplate(couponTemplates);

        // 判断用户是否领过该模版的优惠券，判断领的数量是否达到模版的limitNum的要求
        List<Integer> templateIds = availableTemplate.stream()
                .map(item -> item.getId())
                .collect(Collectors.toList());
        // 根据已有的模版id统计当前用户领取优惠券个数
        List<CouponCountInfoBO> couponCountInfoBOS = couponInfoService.distributeStatics(templateIds, uid);
        // 可用模版中有，但是统计信息中没有的，保留
        // 领取个数没有达到模版要求的张数上限的，保留
        availableTemplate = availableTemplate.stream()
                .filter(item -> {
                    CouponCountInfoBO couponCountInfoBO = couponCountInfoBOS.stream()
                            .filter(info -> item.getId().equals(info.getTemplateId()))
                            .findFirst()
                            .orElse(null);
                    if (couponCountInfoBO == null) {
                        return true;
                    } else {
                        if (item.getLimitNum() > couponCountInfoBO.getNum()) {
                            return true;
                        }
                    }
                    return false;
                })
                .collect(Collectors.toList());

        return availableTemplate.stream().map(item -> {
            CouponTemplateVO couponTemplateVO = new CouponTemplateVO();
            BeanUtils.copyProperties(item, couponTemplateVO);
            couponTemplateVO.setTypeStr(CouponTypeEnum.getCouponTypeEnum(item.getType()).getDesc());
            return couponTemplateVO;
        }).collect(Collectors.toList());

    }

    @Override
    public CouponTemplate templateInfoById(Integer id) {
        return couponTemplateMapper.selectById(id);
    }

    @Override
    public void updateExpireStatusTask() {
        List<CouponTemplate> couponTemplates = couponTemplateMapper.selectList(Wrappers.lambdaQuery(CouponTemplate.class)
                .eq(CouponTemplate::getExpireFlag, 0));
        // 处理过期的优惠券
        availableTemplate(couponTemplates);
    }

    /**
     * 获取到没有过期的模版
     *
     * @param couponTemplates
     * @return
     */
    private List<CouponTemplate> availableTemplate(List<CouponTemplate> couponTemplates) {
//        return couponTemplates.stream()
//                .filter(item -> item.getExpire().after(new Date()))
//                .collect(Collectors.toList());

        // 存储可用的模版
        List<CouponTemplate> availableTemplate = new ArrayList<>();
        // 过期的模版的id
        List<Integer> expireTemplateIds = new ArrayList<>();
        // 处理过期的模版
        if (couponTemplates != null && couponTemplates.size() > 0) {
            couponTemplates.forEach(item -> {
                Date expire = item.getExpire();
                // 判断过期时间是否小于当前时间
                if (expire.before(new Date())) {
                    expireTemplateIds.add(item.getId());
                } else {
                    availableTemplate.add(item);
                }
            });
        }
        // 修改过期模版的过期状态
        if (expireTemplateIds != null && expireTemplateIds.size() > 0) {
            couponTemplateMapper.updateExpireFlagBatch(expireTemplateIds);
        }
        return availableTemplate;
    }

    public static void main(String[] args) {
        String s = StrUtil.padPre("11", 4, "0");
        System.out.println(s);
    }
}
